package com.xuzmian.demo.kotlin

import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty


/**
 * -----该代码示例还不完美-------
 * 对于委托属性，（kotlin1.1以后）可以使用 provideDelegate 操作符拦截委托到属性之间的绑定 。
 * 例如，如果想要在绑定之前检测属性名称，可以这样写：
 */
class ResourceDelegate<T> : ReadOnlyProperty<MyUI, ResourceID<T>> {
    override fun getValue(thisRef: MyUI, property: KProperty<*>): ResourceID<T> {
        return ResourceID<T>()
    }
}

class ResourceLoader<T>(id: ResourceID<T>) {
    operator fun provideDelegate(thisRef: MyUI, prop: KProperty<*>): ReadOnlyProperty<MyUI, ResourceID<T>> {
        checkProperty(thisRef, prop.name)
        // 创建委托
        return ResourceDelegate()
    }

    private fun checkProperty(thisRef: MyUI, name: String) {}
}



open class ResourceID<T> {
    object image_id : ResourceID<String>()
    object text_id : ResourceID<String>()
}

class MyUI {
    val image by bindResource(ResourceID.image_id) //bindResource()产生委托对象
    val text by bindResource(ResourceID.text_id)

    fun <T> bindResource(id: ResourceID<T>): ResourceLoader<T> {
        return ResourceLoader(id)
    }
}




